#include <iostream>
#include <iomanip>
#include <limits>
#include <cstdint>  // For int8_t, uint8_t

void printTypeInfo(const std::string& typeName, size_t size, double minVal, double maxVal) {
    std::cout << std::left << std::setw(12) << typeName
        << std::setw(10) << size
        << std::setw(25) << minVal
        << std::setw(25) << maxVal
        << std::endl;
}

int main() {
    std::cout << std::left << std::setw(12) << "Type"
        << std::setw(10) << "Size (B)"
        << std::setw(25) << "Min Value"
        << std::setw(25) << "Max Value"
        << std::endl;

    printTypeInfo("sbyte", sizeof(int8_t), std::numeric_limits<int8_t>::min(), std::numeric_limits<int8_t>::max());
    printTypeInfo("byte", sizeof(uint8_t), std::numeric_limits<uint8_t>::min(), std::numeric_limits<uint8_t>::max());
    printTypeInfo("short", sizeof(short), std::numeric_limits<short>::min(), std::numeric_limits<short>::max());
    printTypeInfo("ushort", sizeof(unsigned short), std::numeric_limits<unsigned short>::min(), std::numeric_limits<unsigned short>::max());
    printTypeInfo("int", sizeof(int), std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
    printTypeInfo("uint", sizeof(unsigned int), std::numeric_limits<unsigned int>::min(), std::numeric_limits<unsigned int>::max());
    printTypeInfo("long", sizeof(long), std::numeric_limits<long>::min(), std::numeric_limits<long>::max());
    printTypeInfo("ulong", sizeof(unsigned long), std::numeric_limits<unsigned long>::min(), std::numeric_limits<unsigned long>::max());
    printTypeInfo("float", sizeof(float), std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max());
    printTypeInfo("double", sizeof(double), std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
    printTypeInfo("decimal", sizeof(long double), -std::numeric_limits<long double>::max(), std::numeric_limits<long double>::max()); // Approximation

    return 0;
}
